package com.maventools.utils;

import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

/**
 * @BelongsProject: maventools
 * @BelongsPackage: com.maventools.utils
 * @Author: Layla
 * @CreateTime: 2025-04-21  21:32
 * @Description: TODO
 * @Version: 1.0
 * @Since:Java17
 */
@Component
public class EnvUtils {
    /**
     * @Descrption: 配置环境变量，新建 MAVEN_HOME 变量，并在 PATH 中添加 %MAVEN_HOME%\\bin
     * @return
     */
    public boolean setEnvPath(String path) throws InterruptedException, IOException {

        try {
            // 1. 创建或更新 MAVEN_HOME 环境变量
            setEnvironmentVariable("MAVEN_HOME", path);

            // 2. 将 %MAVEN_HOME%\bin 添加到 PATH 环境变量
            addToPath("%MAVEN_HOME%\\bin");

            System.out.println("环境变量设置成功！请打开一个新的命令提示符窗口以使更改生效。");
            return true;

        } catch (Exception e) {
            System.err.println("环境变量设置失败: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 设置环境变量，不存在则创建，存在则更新
     *
     * @param name  环境变量名
     * @param value 环境变量值
     * @throws IOException
     * @throws InterruptedException
     */
    private void setEnvironmentVariable(String name, String value) throws IOException, InterruptedException {
        // 执行 setx 命令
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "setx", name, "\"" + value + "\"", "/M");
        processBuilder.redirectErrorStream(true); // 将错误流合并到输出流
        Process process = processBuilder.start();
        int exitCode = process.waitFor();

        // 获取命令输出
        java.io.InputStream inputStream = process.getInputStream();
        java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(inputStream));
        String line;
        StringBuilder output = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            output.append(line).append(System.lineSeparator());
        }
        String result = output.toString();
        System.out.println("setx " + name + " command output:\n" + result);

        if (exitCode != 0) {
            throw new IOException("设置 " + name + " 环境变量失败. 退出码: " + exitCode + "\n" + result);
        }
    }

    /**
     * 将路径添加到 PATH 环境变量， 避免重复添加
     *
     * @param pathToAdd 要添加到 PATH 的路径
     * @throws IOException
     * @throws InterruptedException
     */
    private void addToPath(String pathToAdd) throws IOException, InterruptedException {
        // 1. 获取当前 PATH 环境变量
        Map<String, String> env = System.getenv();
        String currentPath = env.get("Path");

        // 2. 检查 pathToAdd 是否已经存在于 PATH 中，避免重复添加
        if (currentPath != null && currentPath.contains(pathToAdd)) {
            System.out.println("PATH 环境变量已经包含 " + pathToAdd);
            return; // 已经存在，直接返回
        }

        // 3. 构建新的 PATH 环境变量
        String updatedPath = (currentPath == null || currentPath.isEmpty()) ? pathToAdd : currentPath + ";" + pathToAdd;

        // 4. 设置新的 PATH 环境变量
        setEnvironmentVariable("Path", updatedPath);
    }
}
